package com.kamistoat.meimeimall.meimeimallorder.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.http.client.protocol.ResponseContentEncoding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.util.ArrayList;

/**
 * 远程接口feign的拦截器，作用是同步新请求和源请求的cookie
 */
@Configuration
public class OrderFeignConfig {

    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor(){
        return new RequestInterceptor(){
            /**
             * 重写feign拦截器中唯一的方法
             * @param requestTemplate feign自动生成的请求，即将被发给远程方法接口。默认情况下这个请求不包含请求头
             */
            @Override
            public void apply(RequestTemplate requestTemplate) {
                // 一个集成好的方法。其实就是用ThreadLocal机制，把源请求的所有数据拿来
                ServletRequestAttributes requestAttributes =
                        (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                if(requestAttributes!=null){
                    // if一下。如果源请求就不携带请求头(源请求本身非法登录，无对应的cookie)自然这里也不用管。
                    // 把源请求的所有cookie拿来，当然这里可能有除了记录SessionId的其他cookie，无所谓
                    String oldCookie = requestAttributes.getRequest().getHeader("Cookie");
                    // 为新的请求同步源请求的cookie
                    requestTemplate.header("Cookie", oldCookie);

                    /**
                     * 对于用RequestContextHolder.getRequestAttributes().getRequest()获取到的 HttpServletRequest来说，
                     * 是可以用 HttpServletRequest.getCookies() 直接获取 Cookie[] 的。
                     * 但是没有什么手段可以为 RequestTemplate设置Cookie[]，因此只能以向请求头中添加Cookie字段的方式.
                     * 当然如果你可以确定远程端口所需要的cookie，那也可以对Cookie[]做一次过滤，只把需要的那几个cookie同步过来
                     */
//                    Cookie[] sourceCookies = requestAttributes.getRequest().getCookies();
//                    ArrayList<String> feignCookies =  new ArrayList<>();
//                    for (Cookie cookie : sourceCookies) {
//                        if (cookie.getName() == "LOGINSESSION"){
//                            feignCookies.add(cookie.toString());
//                        }
//                    }
//                    String feignCookieString = String.join(";", feignCookies);
//                    requestTemplate.header("Cookie", feignCookies);
                }
            }
        };
    }
}
